package com.pic.others.service.impl;

import com.pic.common.utils.RandomUtils;
import com.pic.common.utils.StringUtils;
import com.pic.others.service.ICodeService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import static com.pic.common.constants.ErrorInfo.Msg.INVALID_VERIFY_CODE;

import static com.pic.others.constants.user.UserConstants.USER_VERIFY_CODE_TTL;

@Slf4j
@Service
@RequiredArgsConstructor
public class CodeServiceImpl implements ICodeService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Value("${spring.mail.username}")
    private String UserName;//获得配置文件中的username
    @Autowired
    private JavaMailSender mailSender;//发送邮件的bean

    /**
     * 发送验证码
     * @param email
     */
    @Override
    public void sendVerifyCode(String email,String USER_VERIFY_CODE_KEY) {
        String key = USER_VERIFY_CODE_KEY + email;
        //查看code是否存在
        String code=stringRedisTemplate.opsForValue().get(key);
        if(StringUtils.isBlank(code)){
            //2.生成随机验证码
            code= RandomUtils.randomNumbers(4);//生成一个4位随机验证码
            log.info(USER_VERIFY_CODE_KEY);
            //3.保存到redis重
            stringRedisTemplate.opsForValue()
                    .set(USER_VERIFY_CODE_KEY+email,code,USER_VERIFY_CODE_TTL);
        }
        log.info("发送验证码:{}",code);
        //后面将这个改成rabbitmq。异步放入
        //标题
        String title="登录PicMemo邮箱验证";
        //正文内容
        String text = "你的验证码为" + code + "，有效时间为5分钟，请尽快使用并且不要告诉别人。";
        SimpleMailMessage msg=new SimpleMailMessage();
        //发送邮件的邮箱
        msg.setFrom(UserName);
        //发送到哪里
        msg.setTo(email);
        //邮件标题
        msg.setSubject(title);
        //邮件文本
        msg.setText(text);
        mailSender.send(msg);
        log.info("msg是:{}",msg);
    }

//    @Override
//    public void test(String email) {
//        //后面将这个改成rabbitmq。异步放入
//       String code= RandomUtils.randomNumbers(4);//生成一个4位随机验证码
//        log.info("验证码:{}",code);
//        //标题
//        String title="登录PicMemo邮箱验证";
//        //正文内容
//        String text = "你的验证码为" + code + "，有效时间为5分钟，请尽快使用并且不要告诉别人。";
//        SimpleMailMessage msg=new SimpleMailMessage();
//        //发送邮件的邮箱
//        msg.setFrom(UserName);
//        //发送到哪里
//        msg.setTo(email);
//        //邮件标题
//        msg.setSubject(title);
//        //邮件文本
//        msg.setText(text);
//        mailSender.send(msg);
//        log.info("msg是:{}",msg);
//    }

    /**
     * 验证验证码
     * @param email
     * @param code
     * @return
     */
    @Override
    public boolean verifyCode(String email, String code,String USER_VERIFY_CODE_KEY) {
        String cacheCode = stringRedisTemplate.opsForValue().get(USER_VERIFY_CODE_KEY + email);
        if (!StringUtils.equals(cacheCode, code)) {
            // 验证码错误
            log.info(INVALID_VERIFY_CODE);
            return false;
        }
        //消费验证码
        stringRedisTemplate.opsForValue().getOperations().delete(USER_VERIFY_CODE_KEY + email);
        return true;
    }

}
